package stage1.module5.Q2;

import java.util.ArrayList;
import java.util.stream.Stream;

public class Main {

    public static void main(String[] args) {
        // 创建list
        ArrayList<VideoOrder> lst1 = new ArrayList<>();
        ArrayList<VideoOrder> lst2 = new ArrayList<>();

        // 导入测试数据
        lst1.add(new VideoOrder("20194350812",  5,"微服务SpringCloud"));
        lst1.add(new VideoOrder("20190814232", 9, "Redis教程"));
        lst1.add(new VideoOrder("20190523812", 9 ,  "⽹⻚开发教程"));
        lst1.add(new VideoOrder("201932324", 9 , "百万并发实战Netty"));

        lst2.add(new VideoOrder("20190814232", 9, "Redis教程"));
        lst2.add(new VideoOrder("20190522338312", 9 , "⽹⻚开发教程"));
        lst2.add(new VideoOrder("2019435230812", 5 , "Jmeter压⼒测试"));
        lst2.add(new VideoOrder("2019323542411", 7 , "Git+Jenkins持续集成"));
        lst2.add(new VideoOrder("2019323542424", 21 , "Idea全套教程"));

        // 统计出同时被两个人购买的商品列表（取交集）
        System.out.println("交集：");
        ArrayList<VideoOrder> intersection = new ArrayList<>(lst1);
        intersection.retainAll(lst2);
        intersection.forEach(System.out::println);
        System.out.println("-------------------------------------------------\n");

        // 统计出两个人购买商品的差集
        System.out.println("差集：");
        ArrayList<VideoOrder> temp1 = new ArrayList<>(lst1);
        ArrayList<VideoOrder> temp2 = new ArrayList<>(lst2);
        temp1.removeAll(lst2);
        temp2.removeAll(lst1);
        Stream.concat(temp1.stream(), temp2.stream()).forEach(System.out::println);
        System.out.println("-------------------------------------------------\n");

        // 统计出全部被购买商品的去重并集
        System.out.println("去重并集：");
        Stream
                // 将两个list整合到一个stream里
                .concat(lst1.stream(), lst2.stream())
                // 去重
                .distinct()
                .forEach(System.out::println);
        System.out.println("-------------------------------------------------\n");

        // 统计两个人的分别购买订单的平均价格
        System.out.println("平均价格：");
        double lst1Avg =
                lst1.stream()
                        // 提取价格
                        .mapToInt(VideoOrder::getPrice)
                        // 计算平均
                        .average()
                        // 提供默认值
                        .orElse(0.0d);
        System.out.println("一号的订单平均价格：" + lst1Avg);

        double lst2Avg =
                lst2.stream()
                        // 提取价格
                        .mapToInt(VideoOrder::getPrice)
                        // 计算平均
                        .average()
                        // 提供默认值
                        .orElse(0.0d);
        System.out.println("二号的订单平均价格：" + lst2Avg);
        System.out.println("-------------------------------------------------\n");

        // 统计两个人的分别购买订单的总价格
        System.out.println("总价格：");
        int lst1TotalPrice =
                lst1.stream()
                        // 把价格映射出来
                        .map(VideoOrder::getPrice)
                        // 求和
                        .reduce(0, Integer::sum);
        System.out.println("一号的订单总价格：" + lst1TotalPrice);

        int lst2TotalPrice =
                lst2.stream()
                        // 把价格映射出来
                        .map(VideoOrder::getPrice)
                        // 求和
                        .reduce(0, Integer::sum);
        System.out.println("二号的订单总价格：" + lst2TotalPrice);
        System.out.println("-------------------------------------------------\n");
    }
}
